package com.shuma.upms.permission.service.impl;

import com.shuma.upms.permission.domain.entity.UserRole;
import com.shuma.upms.permission.exception.BusinessException;
import com.shuma.upms.permission.mapper.UserRoleMapper;
import com.shuma.upms.permission.service.PermissionService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 权限服务实现类
 *
 * @author zd
 */
@Slf4j
@Service
public class PermissionServiceImpl implements PermissionService {

    @Autowired
    private UserRoleMapper userRoleMapper;

    /**
     * 1: 超级管理员 (super_admin)
     * 2: 普通用户 (user)
     * 3: 管理员 (admin)
     */

    // 绑定默认角色
    @Override
    public void bindDefaultRole(Long userId) {
        log.info("Service: 开始为用户ID {} 绑定默认角色", userId);

        //检查用户是否已绑定角色
        if (userRoleMapper.findByUserId(userId) != null) {
            // 如果已存在，抛出业务异常，由全局异常处理器捕获
            throw new BusinessException("用户已绑定角色，请勿重复操作");
        }

        //创建用户角色关系对象
        UserRole userRole = new UserRole();
        userRole.setUserId(userId);
        //设置为普通用户
        userRole.setRoleId(2);

        //插入操作
        int result = userRoleMapper.insert(userRole);

        //数据库操作结果
        if (result <= 0) {
            throw new BusinessException("数据库操作失败，绑定角色失败");
        }

        log.info("Service: 成功为用户ID {} 绑定默认角色。", userId);
    }

    // 查询用户角色码
    @Override
    public String getUserRoleCode(Long userId) {
        log.debug("Service: 查询用户ID{} 的角色码", userId);
        String roleCode = userRoleMapper.findRoleCodeByUserId(userId);
        if (roleCode == null) {
            log.warn("Service: 未找到用户ID{}对应的角色信息。", userId);
        } else {
            log.debug("Service: 用户ID {} 的角色码为 {}.", userId, roleCode);
        }
        return roleCode;
    }

    // 升级为管理员
    @Override
    public void upgradeToAdmin(Long userId) {
        log.info("Service: 准备将用户ID {}升级为管理员", userId);

        // 确认用户存在角色绑定关系
        if (userRoleMapper.findByUserId(userId) == null) {
            log.error("Service: 尝试对不存在的用户ID {} 进行角色升级操作。", userId);
            throw new BusinessException("用户不存在，无法进行升级操作");
        }

        // 执行更新
        int result = userRoleMapper.updateRoleIdByUserId(userId, 3);

        // 结果校验
        if (result <= 0) {
            log.error("Service: 数据库更新失败，用户ID {}升级为管理员的操作未成功。", userId);
            throw new BusinessException("数据库操作失败，升级为管理员失败");
        }

        log.info("Service: 成功将用户ID {} 升级为管理员。", userId);
    }

    // 降级为普通用户
    @Override
    public void downgradeToUser(Long userId) {
        log.info("Service: 准备将用户ID {} 降级为普通用户", userId);

        // 确认用户存在角色绑定关系
        if (userRoleMapper.findByUserId(userId) == null) {
            log.error("Service: 尝试对不存在的用户ID {} 进行角色降级操作。", userId);
            throw new BusinessException("用户不存在，无法进行降级操作");
        }

        // 执行更新
        int result = userRoleMapper.updateRoleIdByUserId(userId, 2);

        // 结果校验
        if (result <= 0) {
            log.error("Service: 数据库更新失败，用户ID {} 降级为普通用户的操作未成功。", userId);
            throw new BusinessException("数据库操作失败，降级为普通用户失败");
        }

        log.info("Service: 成功将用户ID {}降级为普通用户。", userId);
    }
}